package jwt

import (
	"errors"
	"fmt"
	"github.com/dgrijalva/jwt-go"
	"time"
	"tupu-go/config"
)

// GenerateToken 生成JWT Token
func GenerateToken(claims map[string]interface{}) (string, error) {
	// 创建一个新的令牌对象，指定签名方法
	token := jwt.New(jwt.SigningMethodHS256)

	// 假设 config.Global.Jwt.Expire 单位是小时，将其转换为 time.Duration
	expireHours := time.Duration(config.Global.Jwt.Expire) * time.Hour
	claims["exp"] = time.Now().Add(expireHours).Unix() // 正确设置有效期
	claims["iat"] = time.Now().Unix()

	token.Claims = jwt.MapClaims(claims)

	// 使用密钥签名令牌
	tokenString, err := token.SignedString([]byte(config.Global.Jwt.Secret))
	if err != nil {
		return "", fmt.Errorf("生成Token失败: %w", err)
	}

	return tokenString, nil
}

// ParseToken 解析JWT Token
func ParseToken(tokenString string) (map[string]interface{}, error) {
	// 解析Token
	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		// 验证签名方法
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("无效的签名方法: %v", token.Header["alg"])
		}
		return []byte(config.Global.Jwt.Secret), nil
	})

	if err != nil {
		return nil, fmt.Errorf("解析Token失败: %w", err)
	}

	// 验证Token有效性
	if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
		return claims, nil
	}

	return nil, errors.New("无效的Token")
}
